import Request from './request'
import {
	VUE_APP_BASE_API
} from '../config.js'
import authLogin from '../autuLogin.js'
import {
	checkLogin
} from '../util.js'

// 控制自动登录请求次数
let count = 0

const service = new Request()

service.setConfig((config) => {
	config.baseUrl = VUE_APP_BASE_API
	config.header = {
		...config.header
	}
	return config
})

/**
 * 自定义验证器，如果返回true 则进入响应拦截器的响应成功函数(resolve)，否则进入响应拦截器的响应错误函数(reject)
 * @param { Number } statusCode - 请求响应体statusCode（只读）
 * @return { Boolean } 如果为true,则 resolve, 否则 reject
 */
service.validateStatus = (statusCode) => {
	return statusCode === 200
}

/* 请求之前拦截器 */
service.interceptor.request((config, cancel) => {
	if (!config.noAuth) {
		// 登录过期自动登录
		if (!checkLogin()) return authLogin().then(() => {
			service.request(config)
		});
	}
	getToken() && (config.header['x-token'] = getToken());
	uni.showLoading({
		title: '加载中',
		mask: true
	});
	return config
})

service.interceptor.response((response) => { /* 请求之后拦截器 */

	// 服务端返回的状态码不等于200，则reject()
	if (response.data.code !== 200) {
		if (response.data.code === 401) {
			console.log('hjj', response);
			// 只让这个实例发送一次请求，如果code还是401则抛出错误
			if (count === 1) {
				uni.showToast({
					title: '请求未授权',
					icon: 'none',
					duration: 5000
				});
				return Promise.reject({
					code: response.statusCode,
					message: '请求未授权'
				});
			}
			count++; // count字段自增，可以用来判断请求次数，避免多次发送重复的请求
			// response.config.url = config.instanceURL; // 重置 config的相对地址，避免 `params` 多次添加
		
			return authLogin().then(() => service.request(response.config));
		}
		
		uni.hideLoading()
		uni.showToast({
			title: response.data.message || '服务器繁忙，请稍候再试',
			icon: 'none',
			duration: 5000
		});
		return Promise.reject(response)
	}

	uni.hideLoading()

	return response.data

}, (err) => {

	if (err.statusCode === 401) {
		// 只让这个实例发送一次请求，如果code还是401则抛出错误
		if (err.config.count === 1) {
			return Promise.reject({
				code: err.statusCode,
				message: '请求未授权'
			});
		}
		err.config.count++; // count字段自增，可以用来判断请求次数，避免多次发送重复的请求
		// response.config.url = config.instanceURL; // 重置 config的相对地址，避免 `params` 多次添加

		return authLogin().then(() => service.request(err.config));
	}

	console.error("config: ", err.config);
	uni.hideLoading()
	uni.showToast({
		title: err.message || '服务器繁忙，请稍候再试',
		icon: 'none',
		duration: 5000
	});

	return Promise.reject(err);
})



/**
 * 获取 `localStorage` 中的 `token`
 * @return {string} token字符串
 */
function getToken() {
	return uni.getStorageSync('token');
	// return uni.getStorageSync('token')
}

export {
	service
}
